home *** CD-ROM | disk | FTP | other *** search
/ Programming Sound Cards / Programming Sound Cards.iso / sound_34 / gus.asm next >
Assembly Source File  |  1995-01-01  |  14KB  |  841 lines

  1.     Jumps
  2.     .286
  3.  
  4. _Stack    Segment Para Stack 'Stack'
  5.  
  6.     db    100h dup (0)
  7.  
  8. _Stack    ends
  9.  
  10. Extrn    MainVolume:Word,ChanOn:Word,PatternRow:Word,RealRow:Word,OrderLen:Byte
  11. Extrn    PlayingPattern:Word,RealPPattern:Word,Time:DWord,SampChans:Byte
  12. Extrn    Bar:Byte,NumChans:Word,BasePort:Word,ErrorCode:Word
  13. Extrn    LoadMod:Far,ClearMem:Far,StartPlaying:Far,StopPlaying:Far,Init:Far
  14. Extrn    InitDevice:Far
  15.  
  16. _Code    Segment    Para 'Code'
  17.  
  18.     assume    cs:_Code
  19.  
  20.     ModToRead    db 70 dup (0)
  21.     CommandLine    db 127 dup (0)
  22.     KeySeg        dw 0
  23.     KeyOfs        dw 0
  24.     Key        db 0
  25.     CommandLineC    db 0,'',0Dh
  26.     Error        db '    Internal Error. Restart the computer and try again.$'
  27.     OutOfMem    db '    Not enough memory!$'
  28.     WrongName    db '    File or path not found!$'
  29.     Docs        db 13,10
  30.             db '    Module Player v1.5   (C) Robert Adolfsson (Cascada) 1993.',13,10
  31.             db 13,10
  32.             db '    For Advanced Gravis UltraSound',13,10
  33.             db '    Supports Noisetracker/Soundtracker/StarTrecker (AmigaTrackers)',13,10
  34.             db '             FastTracker 4,6 or 8 channels/OctaComposer (PCTrackers)',13,10
  35.             db 13,10
  36.             db '    Syntax: GUSPLAY <[Path]Filename.ext> /baseport.',13,10
  37.             db '    Where baseport is a three digit hexadecimal number (Def=220).',13,10
  38.             db '$'
  39.  
  40. Palette        db 63,00,00
  41.         db 56,00,08
  42.         db 48,00,16
  43.         db 40,00,24
  44.         db 32,00,32
  45.         db 24,00,40
  46.         db 16,00,48
  47.         db 08,00,56
  48.         db 00,00,63
  49.         db 63,63,00
  50.         db 63,26,00
  51.         db 48,63,00
  52.         db 00,63,00
  53.         db 00,00,00
  54.         db 00,00,00
  55.         db 63,63,63
  56.  
  57. Pic    db '        Modplay v1.5  for Gravis Ultrasound   (C) Robert Adolfsson CASCADA      '
  58.     db '                                                                                '
  59.     db '                                                                                '
  60.     db '      Position    /         Row   /64       Time   :      MainVolume   /64      '
  61.     db '                                                                                '
  62.     db '  PgUp/PgDn : Change position.  1-8 : Turn channels on/off.  +/- : MainVolume   '
  63.     db '  D : Dosshell                                                                  '
  64.     db '                                                                                '
  65.     db '                                                                                '
  66.     db '                                                                                '
  67.     db '                                                                                '
  68.     db '                                                                                '
  69.     db '                                                                                '
  70.     db '                                                                                '
  71.     db '                                                                                '
  72.     db '                                                                                '
  73.     db '                                                                                '
  74.     db '                                                                                '
  75.     db '                                                                                '
  76.     db '                                                                                '
  77.     db '                                                                                '
  78.     db '                                                                                '
  79.     db '                                                                                '
  80.     db '                                                                                '
  81.     db '                                                                                '
  82.  
  83.     db 80 dup (0Fh)
  84.     db 80 dup (19h)
  85.     db 80 dup (29h)
  86.     db 80 dup (39h)
  87.     db 80 dup (49h)
  88.     db 80 dup (59h)
  89.     db 80 dup (69h)
  90.     db 80 dup (79h)
  91.     db 80 dup (80h)
  92.     db 80 dup (7Ah)
  93.     db 80 dup (69h)
  94.     db 80 dup (5Bh)
  95.     db 80 dup (4Ch)
  96.     db 80 dup (5Ch)
  97.     db 80 dup (6Ch)
  98.     db 80 dup (7Ch)
  99.     db 80 dup (89h)
  100.     db 80 dup (70h)
  101.     db 80 dup (6Ah)
  102.     db 80 dup (59h)
  103.     db 80 dup (4Bh)
  104.     db 80 dup (3Ch)
  105.     db 80 dup (2Ch)
  106.     db 80 dup (1Ch)
  107.     db 80 dup (0Ch)
  108.  
  109. EvenData
  110. PrintTable    db 0,0,0,0
  111.         Rept 127
  112.         db 0,0,0,0
  113.         EndM
  114. BarTable    dw 8 dup (0)
  115. ComSpec        db 128 dup (0)
  116. PSPAdress    dw 0
  117. OldSS        dw 0
  118. OldSP        dw 0
  119. Environment    dw 0        ; Environment segment.
  120.         dw 0,0        ; Commandline segment and offset.
  121.         dw 0,0        ; First FCB segment and offset.
  122.         dw 0,0        ; Second FCB segment and offset.
  123.  
  124. SetPalReg    Macro    P,R,G,B
  125.  
  126.     mov    dx,3C8h
  127.     mov    al,P
  128.     out    dx,al
  129.     inc    dx
  130.     mov    al,R
  131.     out    dx,al
  132.     mov    al,G
  133.     out    dx,al
  134.     mov    al,B
  135.     out    dx,al
  136.  
  137.         EndM
  138.  
  139. Even
  140.  
  141. Begin:
  142.     mov    cs:[PSPAdress],es
  143.     push    es
  144.     call    GetFileName
  145.     pop    ds
  146.     call    GetComSpec
  147.     mov    ax,cs
  148.     mov    ds,ax
  149.     mov    ax,4A00h
  150.     mov    bx,18129/16+1
  151.     int    21h
  152.     jnc    NoStop
  153.     mov    ah,9
  154.     push    cs
  155.     pop    ds
  156.     mov    dx,offset cs:[Error]
  157.     int    21h
  158.     jmp    Stop
  159. NoStop:
  160.  
  161.     call    InitDevice
  162.     call    Init
  163.     mov    dx,cs
  164.     mov    ds,dx
  165.     mov    dx,offset cs:[ModToRead]
  166.     call    LoadMod
  167.     jnc    NoErrorLoad
  168.     mov    ax,seg MainVolume
  169.     mov    ds,ax
  170.     cmp    ds:[ErrorCode],1
  171.     jne    NoFile
  172.     mov    dx,offset cs:[WrongName]
  173. NoFile:
  174.     cmp    ds:[ErrorCode],3
  175.     jne    NoMem
  176.     mov    dx,offset cs:[OutOfMem]
  177. NoMem:
  178.     push    cs
  179.     pop    ds
  180.     mov    ah,9
  181.     int    21h
  182.     jmp    Stop
  183. NoErrorLoad:
  184.  
  185.     mov    di,cs
  186.     mov    es,di
  187.     mov    di,offset cs:[PrintTable]
  188.     mov    cx,128
  189.     mov    al,30h
  190.     mov    ah,30h
  191.     mov    bl,30h
  192.     mov    bh,30h
  193. FillPTable:
  194.     mov    es:[di],al
  195.     mov    es:[di+1],ah
  196.     mov    es:[di+2],bl
  197.     mov    es:[di+3],bh
  198.     add    di,4
  199.     inc    al
  200.     cmp    al,3Ah
  201.     jb    NoWrapCount
  202.     mov    al,30h
  203.     inc    ah
  204.     cmp    ah,3Ah
  205.     jb    NoWrapCount
  206.     mov    ah,30h
  207.     inc    bl
  208.     cmp    bl,3Ah
  209.     jb    NoWrapCount
  210.     mov    bl,30h
  211.     inc    bh
  212. NoWrapCount:
  213.     loop    FillPTable
  214.  
  215.     call    StartPlaying
  216.  
  217. FromDosShell:
  218.     mov    ax,3509h
  219.     int    21h
  220.     mov    cs:[KeySeg],es
  221.     mov    cs:[KeyOfs],bx
  222.     mov    ax,2509h
  223.     mov    dx,cs
  224.     mov    ds,dx
  225.     mov    dx,offset cs:[KeyInt]
  226.     int    21h
  227.  
  228.     mov    bl,0
  229.     mov    ax,1003h
  230.     int    10h
  231.  
  232.     MOV    AH,0
  233. SETPAL:
  234.     MOV    DX,3DAH
  235.     IN    AL,DX
  236.     MOV    DX,3C0H
  237.     MOV    AL,AH
  238.     OUT    DX,AL
  239.     JMP    $+2
  240.     OUT    DX,AL
  241.     INC    AH
  242.     CMP    AH,16
  243.     JB    SETPAL
  244.  
  245.     MOV    DX,3DAH
  246.     IN    AL,DX
  247.     MOV    DX,3C0h
  248.     MOV    AL,20H
  249.     OUT    DX,AL
  250.  
  251.     mov    si,cs
  252.     mov    ds,si
  253.     mov    si,offset cs:[Palette]
  254.     mov    dx,3C8h
  255.     mov    al,0
  256.     out    dx,al
  257.     inc    dx
  258.     mov    cx,16*3
  259. rep    outsb
  260.  
  261.     cld
  262.     mov    di,0B800h
  263.     mov    es,di
  264.     mov    di,0
  265.     mov    cx,2000
  266.     mov    si,cs
  267.     mov    ds,si
  268.     mov    si,offset cs:[Pic]
  269. LoadPic:
  270.     movsb
  271.     mov    al,ds:[si+2000-1]
  272.     stosb
  273.     loop    LoadPic
  274.  
  275.     call    ProgramChars
  276.  
  277.     mov    di,0A000h
  278.     mov    es,di
  279.  
  280.     cld
  281.     mov    cx,9
  282. FillCharLoop:
  283.     push    cx
  284.     mov    di,256
  285.     sub    di,cx
  286.     shl    di,5
  287.     neg    cx
  288.     add    cx,9
  289.     shl    cx,1
  290.     mov    bx,16
  291.     sub    bx,cx
  292.     mov    al,0h
  293. rep    stosb
  294.     mov    al,3Eh
  295.     mov    cx,bx
  296. rep    stosb
  297.     sub    di,32+16
  298.     pop    cx
  299.     loop    FillCharLoop
  300.  
  301.     mov    di,0B800h
  302.     mov    es,di
  303.  
  304.     call    NoProgramChars
  305.  
  306.     mov    ax,seg MainVolume
  307.     mov    ds,ax
  308.  
  309.     mov    cx,ds:[NumChans]
  310.     cmp    cx,6
  311.     je    SixChans
  312.     cmp    cx,8
  313.     je    EigthChans
  314.     mov    cs:[BarTable],17*80*2+01*2
  315.     mov    cs:[BarTable+2],17*80*2+21*2
  316.     mov    cs:[BarTable+4],17*80*2+41*2
  317.     mov    cs:[BarTable+6],17*80*2+61*2
  318.     jmp    FourChans
  319. SixChans:
  320.     mov    cs:[BarTable],8*80*2+21*2
  321.     mov    cs:[BarTable+2],8*80*2+41*2
  322.     mov    cs:[BarTable+4],17*80*2+01*2
  323.     mov    cs:[BarTable+6],17*80*2+21*2
  324.     mov    cs:[BarTable+8],17*80*2+41*2
  325.     mov    cs:[BarTable+10],17*80*2+61*2
  326.     jmp    FourChans
  327. EigthChans:
  328.     mov    cs:[BarTable],8*80*2+01*2
  329.     mov    cs:[BarTable+2],8*80*2+21*2
  330.     mov    cs:[BarTable+4],8*80*2+41*2
  331.     mov    cs:[BarTable+6],8*80*2+61*2
  332.     mov    cs:[BarTable+8],17*80*2+01*2
  333.     mov    cs:[BarTable+10],17*80*2+21*2
  334.     mov    cs:[BarTable+12],17*80*2+41*2
  335.     mov    cs:[BarTable+14],17*80*2+61*2
  336. FourChans:
  337.  
  338.     mov    di,19
  339.     mov    dx,3
  340.     mov    bh,0
  341.     mov    bl,ds:[OrderLen]
  342.     call    PrintVal
  343.  
  344.     mov    ah,2
  345.     mov    bh,0
  346.     mov    dh,25
  347.     mov    dl,0
  348.     int    10h
  349.  
  350.     mov    ax,Seg MainVolume
  351.     mov    ds,ax
  352.     mov    ax,0B800h
  353.     mov    es,ax
  354.  
  355. DoLoop:
  356.     mov    dx,3DAh
  357. Test1:
  358.     in    al,dx
  359.     test    al,8
  360.     jnz    Test1
  361. Test2:
  362.     in    al,dx
  363.     test    al,8
  364.     jz    Test2
  365.     mov    ax,Seg MainVolume
  366.     mov    ds,ax
  367.     mov    di,0B800h
  368.     mov    es,di
  369.     mov    di,69
  370.     mov    dx,3
  371.     mov    bx,ds:[MainVolume]
  372.     call    PrintSec
  373.     mov    di,15
  374.     mov    dx,3
  375.     mov    bx,ds:[RealPPattern]
  376.     call    PrintVal
  377.     mov    di,32
  378.     mov    dx,3
  379.     mov    bx,ds:[RealRow]
  380.     inc    bx
  381.     call    PrintSec
  382.     mov    ax,Word Ptr cs:[Time]
  383.     mov    dx,Word Ptr cs:[Time+2]
  384.     mov    bx,1000
  385.     div    bx
  386.     mov    dx,0
  387.     mov    bx,60
  388.     div    bx
  389.     mov    bx,ax
  390.     mov    si,dx
  391.     mov    dx,3
  392.     mov    di,49
  393.     call    PrintSec
  394.     mov    bx,si
  395.     mov    dx,3
  396.     mov    di,52
  397.     call    PrintSec
  398.  
  399.     cld
  400.     mov    si,offset ds:[SampChans]
  401.     mov    cx,ds:[NumChans]
  402.  
  403. BarLoop:
  404.     push    cx
  405.     mov    di,ds:[NumChans]
  406.     sub    di,cx
  407.     shl    di,1
  408.     mov    di,cs:[BarTable+di]
  409.  
  410.     mov    bx,Word Ptr ds:[si.Bar]
  411.     mov    cx,63
  412.     sub    cx,bx
  413.     shr    cx,3
  414.     cmp    cx,0
  415.     je    NoSuddBar
  416.     cmp    bx,0
  417. SuddIt:
  418.     mov    al,32
  419.     Rept    18
  420.     stosb
  421.     inc    di
  422.     EndM
  423.     add    di,160-2*18
  424.     loop    SuddIt
  425. NoSuddBar:
  426.     mov    cx,bx
  427.     and    bx,7
  428.     neg    bl
  429.     dec    bl
  430.     mov    al,bl
  431.     Rept    18
  432.     stosb
  433.     inc    di
  434.     EndM
  435.     add    di,160-2*18
  436.     shr    cx,3
  437.     cmp    cx,0
  438.     je    NoFillBar
  439.     mov    al,255-8
  440. FillSecond:
  441.     Rept    18
  442.     stosb    
  443.     inc    di
  444.     EndM
  445.     add    di,160-2*18
  446.     loop    FillSecond
  447. NoFillBar:
  448.  
  449.     sub    ds:[si.Bar],1
  450.     jnc    NoWBar
  451.     mov    ds:[si.Bar],0
  452. NoWBar:
  453.  
  454.     pop    cx
  455.     add    si,52
  456.     dec    cx
  457.     jnz    BarLoop
  458.  
  459. EndPrintVals:
  460.     cmp    cs:[Key],20h
  461.     jne    NoDosShell
  462.     mov    cs:[Key],0
  463.     pusha
  464.     push    ds
  465.     push    es
  466.     cli
  467.     mov    cs:[OldSS],ss
  468.     mov    cs:[OldSP],sp
  469.     sti
  470.     mov    ax,2509h
  471.     mov    ds,cs:[KeySeg]
  472.     mov    dx,cs:[KeyOfs]
  473.     int    21h
  474.     mov    ax,3
  475.     int    10h
  476.     mov    cs:[Environment],0
  477.     mov    cs:[Environment+2],Offset cs:[CommandLineC]
  478.     mov    Word Ptr cs:[Environment+4],cs
  479.     mov    cs:[Environment+6],5Ch
  480.     mov    ax,cs:[PSPAdress]
  481.     mov    Word Ptr cs:[Environment+8],ax
  482.     mov    cs:[Environment+10],6Ch
  483.     mov    Word Ptr cs:[Environment+12],ax
  484.     mov    bx,cs
  485.     mov    ds,bx
  486.     mov    es,bx
  487.     mov    bx,offset cs:[Environment]
  488.     mov    dx,offset cs:[ComSpec]
  489.     mov    ax,4B00h
  490.     int    21h
  491.     cli
  492.     mov    ss,cs:[OldSS]
  493.     mov    sp,cs:[OldSP]
  494.     sti
  495.     pop    es
  496.     pop    ds
  497.     popa
  498.     jmp    FromDosShell
  499. NoDosShell:
  500.     cmp    cs:[Key],1
  501.     jne    DoLoop
  502.     
  503.     mov    ax,2509h
  504.     mov    ds,cs:[KeySeg]
  505.     mov    dx,cs:[KeyOfs]
  506.     int    21h
  507.     call    StopPlaying
  508.     call    ClearMem
  509.     mov    ax,3
  510.     int    10h
  511. Stop:
  512.     mov    ax,4C00h
  513.     int    21h
  514.  
  515. GetComSpec    Proc    Near
  516.  
  517.     mov    ds,ds:[2Ch]
  518.     mov    si,0
  519. FindComSpec:
  520.     lodsb
  521.     cmp    al,0
  522.     jne    NoTestEnd
  523.     lodsb
  524.     cmp    al,0
  525.     je    EndSearchEnv
  526. NoTestEnd:
  527.     cmp    al,'C'
  528.     jne    FindComSpec
  529.     lodsb
  530.     cmp    al,'O'
  531.     jne    FindComSpec
  532.     lodsb
  533.     cmp    al,'M'
  534.     jne    FindComSpec
  535.     lodsb
  536.     cmp    al,'S'
  537.     jne    FindComSpec
  538.     lodsb
  539.     cmp    al,'P'
  540.     jne    FindComSpec
  541.     lodsb
  542.     cmp    al,'E'
  543.     jne    FindComSpec
  544.     lodsb
  545.     cmp    al,'C'
  546.     jne    FindComSpec
  547.     mov    di,offset cs:[ComSpec]
  548.     inc    si
  549. LetsMoveIt:
  550.     lodsb
  551.     cmp    al,0
  552.     je    EndSearchEnv
  553.     mov    cs:[di],al
  554.     inc    di
  555.     jmp    LetsMoveIt
  556. EndSearchEnv:
  557.     ret
  558.  
  559. GetComSpec    EndP
  560.  
  561. ProgramChars    Proc    Near
  562.  
  563.     mov    dx,3C4h
  564.     mov    ax,0100h
  565.     out    dx,ax
  566.     mov    ax,0402h
  567.     out    dx,ax
  568.     mov    ax,0704h
  569.     out    dx,ax
  570.     mov    ax,0300h
  571.     out    dx,ax
  572.  
  573.     mov    dx,3CEh
  574.     mov    ax,0204h
  575.     out    dx,ax
  576.     mov    ax,0005h
  577.     out    dx,ax
  578.     mov    ax,0006h
  579.     out    dx,ax
  580.     ret
  581.  
  582. ProgramChars    EndP
  583.  
  584. NoProgramChars    Proc    Near
  585.  
  586.     mov    dx,3C4h
  587.     mov    ax,0100h
  588.     out    dx,ax
  589.     mov    ax,0302h
  590.     out    dx,ax
  591.     mov    ax,0304h
  592.     out    dx,ax
  593.     mov    ax,0300h
  594.     out    dx,ax
  595.  
  596.     mov    dx,3CEh
  597.     mov    ax,0004h
  598.     out    dx,ax
  599.     mov    ax,1005h
  600.     out    dx,ax
  601.     mov    ax,0E06h
  602.     out    dx,ax
  603.     ret
  604.  
  605. NoProgramChars    EndP
  606.  
  607. PrintChar    Proc    Near
  608.  
  609.     shl    di,1
  610.     shl    dx,5
  611.     add    di,dx
  612.     shl    dx,2
  613.     add    di,dx
  614.     stosb
  615.     ret
  616.  
  617. PrintChar    EndP
  618.  
  619. PrintVal    Proc    Near
  620.  
  621.     cld
  622.     shl    di,1
  623.     shl    dx,5
  624.     add    di,dx
  625.     shl    dx,2
  626.     add    di,dx
  627.     shl    bx,2
  628.     mov    al,cs:[PrintTable+bx+2]
  629.     stosb
  630.     inc    di
  631.     mov    al,cs:[PrintTable+bx+1]
  632.     stosb
  633.     inc    di
  634.     mov    al,cs:[PrintTable+bx]
  635.     stosb
  636.     ret
  637.  
  638. PrintVal    EndP
  639.  
  640. PrintSec    Proc    Near
  641.  
  642.     cld
  643.     shl    di,1
  644.     shl    dx,5
  645.     add    di,dx
  646.     shl    dx,2
  647.     add    di,dx
  648.     shl    bx,2
  649.     mov    al,cs:[PrintTable+bx+1]
  650.     stosb
  651.     inc    di
  652.     mov    al,cs:[PrintTable+bx]
  653.     stosb
  654.     ret
  655.  
  656. PrintSec    EndP
  657.  
  658. KeyInt        Proc    Near
  659.  
  660.     push    ax
  661.     push    ds
  662.     mov    ax,Seg MainVolume
  663.     mov    ds,ax
  664.     in    al,60h
  665.     cmp    al,127
  666.     ja    NoKey
  667.     mov    cs:[Key],al
  668. NoKey:
  669.     cmp    al,74
  670.     jne    NoVolDown
  671.     sub    [MainVolume],1
  672.     jns    NoVolDown
  673.     mov    [MainVolume],0
  674. NoVolDown:
  675.     cmp    al,78
  676.     jne    NoVolUp
  677.     add    [MainVolume],1
  678.     cmp    [MainVolume],64
  679.     jbe    NoVolUp
  680.     mov    [MainVolume],64
  681. NoVolUp:
  682.     cmp    al,81
  683.     jne    NoChangePatt1
  684.     mov    [PatternRow],64
  685. NoChangePatt1:
  686.     cmp    al,73
  687.     jne    NoChangePatt2
  688.     mov    [PatternRow],64
  689.     sub    [PlayingPattern],2
  690.     jns    NoChangePatt2
  691.     mov    [PlayingPattern],0
  692. NoChangePatt2:
  693.     cmp    al,2
  694.     jne    NoChan1OnOff
  695.     xor    [ChanOn],00000001b
  696. NoChan1OnOff:
  697.     cmp    al,3
  698.     jne    NoChan2OnOff
  699.     xor    [ChanOn],00000010b
  700. NoChan2OnOff:
  701.     cmp    al,4
  702.     jne    NoChan3OnOff
  703.     xor    [ChanOn],00000100b
  704. NoChan3OnOff:
  705.     cmp    al,5
  706.     jne    NoChan4OnOff
  707.     xor    [ChanOn],00001000b
  708. NoChan4OnOff:
  709.     cmp    al,6
  710.     jne    NoChan5OnOff
  711.     xor    [ChanOn],00010000b
  712. NoChan5OnOff:
  713.     cmp    al,7
  714.     jne    NoChan6OnOff
  715.     xor    [ChanOn],00100000b
  716. NoChan6OnOff:
  717.     cmp    al,8
  718.     jne    NoChan7OnOff
  719.     xor    [ChanOn],01000000b
  720. NoChan7OnOff:
  721.     cmp    al,9
  722.     jne    NoChan8OnOff
  723.     xor    [ChanOn],10000000b
  724. NoChan8OnOff:
  725.     in    al,61h
  726.     or    al,80h
  727.     out    61h,al
  728.     and    al,7Fh
  729.     out    61h,al
  730.     mov    al,20h
  731.     out    20h,al
  732.     pop    ds
  733.     pop    ax
  734.     iret
  735.  
  736. KeyInt        EndP
  737.  
  738. GetFileName    Proc    Near
  739.  
  740.     push    bx
  741.     push    di
  742.     mov    di,offset cs:[CommandLine]
  743.     mov    bx,82h
  744.     mov    al,es:[bx-2]
  745.     cmp    al,0
  746.     jne    TestNext
  747.     jmp    NoCmdLine
  748. TestNext:
  749.     mov    al,es:[bx]
  750.     cmp    al,0
  751.     jne    GetIt
  752.     jmp    NoCmdLine
  753.  
  754. GetIt:
  755.     mov    al,es:[bx]
  756.     inc    bx
  757.     mov    cs:[di],al
  758.     inc    di
  759.     cmp    al,0Dh
  760.     je    GotIt
  761.     jmp    GetIt
  762. GotIt:
  763.     mov    di,offset cs:[CommandLine]
  764.     mov    bx,offset cs:[ModToRead]
  765. MoveName:
  766.     mov    al,cs:[di]
  767.     inc    di
  768.     cmp    al,0Dh
  769.     jne    NotYetCommand
  770.     jmp    EndMoveName
  771. NotYetCommand:
  772.     cmp    al,32
  773.     je    CheckCommands
  774.     mov    cs:[bx],al
  775.     inc    bx
  776.     jmp    MoveName
  777. CheckCommands:
  778.     mov    al,cs:[di]
  779.     inc    di
  780.     cmp    al,0Dh
  781.     je    EndMoveName
  782.     cmp    al,'/'
  783.     jne    NoNewBase
  784.     mov    bh,0
  785.     mov    bl,cs:[di]
  786.     cmp    bl,'A'
  787.     jb    UsSub1
  788.     sub    bl,'A'
  789.     add    bl,10
  790.     jmp    NoUsSub1
  791. UsSub1:
  792.     sub    bl,30h
  793. NoUsSub1:
  794.     mov    ah,bl
  795.     mov    bl,cs:[di+1]
  796.     cmp    bl,'A'
  797.     jb    UsSub2
  798.     sub    bl,'A'
  799.     add    bl,10
  800.     jmp    NoUsSub2
  801. UsSub2:
  802.     sub    bl,30h
  803. NoUsSub2:
  804.     shl    bl,4
  805.     mov    al,bl
  806.     mov    bl,cs:[di+2]
  807.     cmp    bl,'A'
  808.     jb    UsSub3
  809.     sub    bl,'A'
  810.     add    bl,10
  811.     jmp    NoUsSub3
  812. UsSub3:
  813.     sub    bl,30h
  814. NoUsSub3:
  815.     add    ax,bx
  816.     mov    bx,Seg MainVolume
  817.     mov    ds,bx
  818.     mov    ds:[BasePort],ax
  819.     add    di,3
  820. NoNewBase:
  821.     jmp    CheckCommands
  822. EndMoveName:
  823.     pop    di
  824.     pop    bx
  825.     ret
  826.  
  827. GetFileName    Endp
  828.  
  829. NoCmdLine:
  830.  
  831.     mov    ah,9
  832.     push    cs
  833.     pop    ds
  834.     mov    dx,offset cs:[Docs]
  835.     int    21h
  836.     mov    ax,4C00h
  837.     int    21h
  838.  
  839. _Code        EndS
  840.  
  841.     End    Begin